package com.kclm.xsap.web.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.kclm.xsap.consts.KeyNameOfCache;
import com.kclm.xsap.consts.OperateType;
import com.kclm.xsap.dao.ScheduleRecordDao;
import com.kclm.xsap.entity.*;
import com.kclm.xsap.service.*;
import com.kclm.xsap.utils.R;
import com.kclm.xsap.vo.MemberCardStatisticsVo;
import com.kclm.xsap.vo.MemberCardStatisticsWithTotalDataInfoVo;
import com.kclm.xsap.vo.statistics.CardCostVo;
import com.kclm.xsap.vo.statistics.ClassCostVo;
import com.kclm.xsap.vo.statistics.StatisticsOfCardCostVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 数据统计控制器
 */
@Controller
@Slf4j
@RequestMapping("/statistics")
public class StatisticsController {
@Autowired
private ConsumeRecordService consumeRecordService;
@Autowired
private StatisticsService statisticsService;
@Autowired
private ScheduleRecordDao scheduleRecordDao;
@Resource
private MapCacheService mapCacheService;

    @GetMapping("/x_card_list_stat.html")
    public String togoCardListStat() {
        return "statistics/x_card_list_stat";
    }

    @GetMapping("/x_card_cost_stat.html")
    public String togoCardCostStat() {
        return "statistics/x_card_cost_stat";
    }

    @GetMapping("/x_class_cost_stat.html")
    public String togoClassCostStat() {
        return "statistics/x_class_cost_stat";
    }

    @GetMapping("/x_class_hour_stat.html")
    public String togoClassHourStat() {
        return "statistics/x_class_hour_stat";
    }

    @GetMapping("/x_member_num_static.html")
    public String togoMemberNumStat() {
        return "statistics/x_member_num_static";
    }

    //会员卡统计
    @PostMapping("/cardInfo.do")
    @ResponseBody
    public R cardInfo(){
      MemberCardStatisticsWithTotalDataInfoVo memberCardStatisticsWithTotalDataInfoVo=statisticsService.cardInfo();
      return R.ok().put("data", memberCardStatisticsWithTotalDataInfoVo);
    }

    /**
     * 刷新缓存数据
     * @return 响应对象，表示刷新缓存操作的结果
     */
    @GetMapping("refreshCache.do")
    @ResponseBody
    public R refreshCache(){
        // 获取缓存信息的哈希映射
        HashMap<KeyNameOfCache, Object> CACHE_MEMBER_CARD_INFO_MAP = mapCacheService.getCacheInfo();
        // 移除会员卡信息缓存
        CACHE_MEMBER_CARD_INFO_MAP.remove(KeyNameOfCache.CACHE_OF_MEMBER_CARD_INFO);
        // 如果移除操作后，会员卡信息缓存仍然存在，则返回错误响应
        if (CACHE_MEMBER_CARD_INFO_MAP.containsKey(KeyNameOfCache.CACHE_OF_MEMBER_CARD_INFO)) {
            return R.error();
        } else {
            // 否则返回成功响应
            return R.ok();
        }
    }


    /**
     *  这个方法用于获取包含消费记录的年份列表。
     *  它首先从数据库中获取所有的消费记录，然后提取出最早记录的年份，并从该年份到当前年份构建一个年份列表。
     */
    @PostMapping("/yearList")
    @ResponseBody
    public R yearList(){
        // 从数据库中获取所有消费记录，按照创建时间升序排序，并只选择创建时间字段
        List<ConsumeRecordEntity> consumeRecordEntityList = consumeRecordService.list(new QueryWrapper<ConsumeRecordEntity>()
                .select("create_time")
                .orderByAsc("create_time"));
        // 提取最早记录的年份
        int minMonth= consumeRecordEntityList.get(0).getCreateTime().getYear();
        // 初始化一个列表来存储年份
        List<Integer> yearList=new ArrayList<>();
        // 将最早记录的年份到当前年份的所有年份添加到列表中
        for (int i=minMonth;i<= LocalDate.now().getYear();i++){
            yearList.add(i);
        }
        // 返回年份列表封装在一个R响应对象中
        return R.ok().put("data", yearList);
    }

    /**
     *   这个方法用于根据指定的时间段（月份、季度或年份）获取卡费用统计。
     *   它首先验证用户输入的开始年份和结束年份是否合法，然后调用统计服务获取相应时间段的卡费用统计。
     */
    @PostMapping("/cardCostMonthOrSeasonOrYear")
    @ResponseBody
    public R cardCostMonthOrSeasonOrYear(StatisticsOfCardCostVo statisticsOfCardCostVo){
        // 提取开始年份和结束年份
        Integer beginYear=statisticsOfCardCostVo.getBeginYear();
        Integer endYear=statisticsOfCardCostVo.getEndYear();
        // 验证结束年份是否早于开始年份
        if (endYear < beginYear) {
            return R.error("起始时间与结束时间冲突！请修改后再查看统计结果");
        }else {
            // 获取指定时间段的卡费用统计
            CardCostVo cardCostVo=statisticsService.getcardCostVo(statisticsOfCardCostVo);
            // 检查是否有数据
            if (cardCostVo==null){
                return R.error("你所查询的时间段没有数据！");
            }else {
                // 返回统计数据封装在一个R响应对象中
                return R.ok().put("data", cardCostVo);
            }
        }
    }


}
